home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2000 #1 / Amiga Plus CD - 2000 - No. 1.iso / Tools / Dev / mamesrc / include / moo / moo.h < prev   
C/C++ Source or Header  |  1999-12-03  |  3KB  |  99 lines

  1. #ifndef MOO_H
  2. #define MOO_H
  3.  
  4. #include <stdio.h>
  5.  
  6. #ifndef TRUE
  7. #define TRUE 1
  8. #endif
  9.  
  10. #ifndef FALSE
  11. #define FALSE 0
  12. #endif
  13.  
  14. typedef void    *(*clone_f)(void *obj, int clone_state);
  15. typedef void    (*dispose_f)(void *obj);
  16.  
  17. typedef struct
  18. {
  19.     clone_f        Clone;
  20.     dispose_f    Dispose;
  21.     size_t        Size;
  22.     uint        Flags;
  23.     int            RefCount;
  24. } obj_t;
  25.  
  26. #define OBJF_ALLOCATED    1
  27. #define OBJF_DISPOSED    2
  28.  
  29. obj_t    *objClone(obj_t *this, int clone_state);
  30. void    objDispose(obj_t *this);
  31. int        objInit(obj_t *this);
  32. obj_t    *objNew(size_t size);
  33.  
  34. #define Dispose(obj)    (((obj_t *)(obj))->Dispose(obj))
  35.  
  36. /* If clone_state = TRUE then the entire state of the object is cloned so
  37. ** the new object is identical to the original. Otherwise only the initial
  38. ** state is cloned. */
  39.  
  40. #define Clone(obj, clone_state)    (((obj_t *)(obj))->Clone(obj, clone_state))
  41.  
  42. /* If a class does Dispose() on objects that weren't created by the class
  43. ** itself then IncRefCount() must be used on such object. If this is not done
  44. ** then an object will be free while it still may be in use somewhere else. */
  45.  
  46. #define IncRefCount(obj)    (++(((obj_t *)(obj))->RefCount))
  47.  
  48. /* All classes should do a if(DecRefCount(this) <= 0) in the dispose function to make
  49. ** sure that the object is only freed when it's no longer in use. */
  50.  
  51. #define DecRefCount(obj)    (--(((obj_t *)(obj))->RefCount))
  52.  
  53. typedef struct
  54. {
  55.     obj_t    Obj;
  56.     char    *Buf;
  57.     uint    Length;
  58.     uint    MaxLength;
  59.     uint    MinLength;
  60. } string_t;
  61.  
  62. #define STRE_OK        0
  63. #define STRE_NOMEM    1
  64.  
  65. /* string API: */
  66.  
  67. string_t    *stringNew(char *str, uint min_len);
  68. char        *stringGet(string_t *string);
  69. int            stringAdd(string_t *string, uint tail, char *strs,...);
  70. void        stringClear(string_t *string);
  71. int            stringSet(string_t *string, char *str);
  72. #define        stringAddHead(string,str)    stringAdd(string,0,str,(char *)NULL)
  73. #define        stringAddTail(string,str)    stringAdd(string,1,str,(char *)NULL)
  74.  
  75. /* DEBUG_OBJVALID should be used at the top of every method except New, Init and Dispose.
  76. ** DEBUG_DISPOSEOBJVALID should be used in Dispose because it's normal that the RefCount
  77. ** is < 0 in Dispose. */
  78.  
  79. #ifdef DEBUG
  80. #define DEBUG_OBJVALID(funcname,obj)        if(!(obj) || (((obj_t *)(obj))->RefCount < 0)) \
  81. { \
  82.     printf("DEBUG_ERROR: Invalid object pointer in "funcname" (\""__FILE__"\" line %d).\n", __LINE__); \
  83.     if(obj) puts("RefCount < 0."); \
  84.     else puts("NULL pointer."); \
  85.     puts("Press [Return] to continue."); \
  86.     getchar(); \
  87. }
  88. #define DEBUG_DISPOSEOBJVALID(class,obj)    if(!(obj)) \
  89. { \
  90.     printf("DEBUG_ERROR: Invalid object pointer in "class"Dispose (\""__FILE__"\" line %d).\nNULL pointer.\nPress [Return] to continue", __LINE__); \
  91.     getchar(); \
  92. }
  93. #else
  94. #define DEBUG_OBJVALID(funcname,obj)
  95. #define DEBUG_DISPOSEOBJVALID(class,obj)
  96. #endif
  97.  
  98. #endif
  99.